package structure.proxy.dynamicProxy.daos;

import java.lang.reflect.Proxy;

public class ProxyFactory {
    // 维护一个目标对象
    private Object target;

    // 构造器聚合target
    public ProxyFactory(Object target) {
        this.target = target;
    }

    /**
     * 1. 当前目标对象的类加载器
     * 2. 当前目标对象实现的所有接口
     * 3. 事件的处理，执行目标对象方法的时候：
     * 先是触发当前的处理器，
     * 把要调用的方法当作参数method传入，
     * 通过invoke调用 invoke(调用对象, 方法中的参数s)
     *
     * @return 动态生成代理对象
     */
    public Object getProxyInstance() {
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                (proxy, method, args) -> {
                    System.out.println("dynamic structure.proxy begins");
                    // 反射机制调用目标对象的方法
                    return method.invoke(target, args);
                }
        );
    }
}
